مترجم: حبیب الله علیخانی
منبع:راسخون



 

دیباگ یا اشکال زدایی

توسعه دهنده ها از روش های مختلفی برای دیباگ استفاده می کنند
در ابتدا برنامه نویسان جاوا کد هایی مانند زیر می نوشتند :

public class BadDebugExample {
public static void main(String[] args)
{
System.out.println("1");
Calculator calc = new Calculator();
System.out.println("2");
String results = calc.doCalculation(4);
System.out.println("3");
String results2 = calc.doCalculation(5);
System.out.println("4");
String results3 = calc.doCalculation(6);
}
}

این نمونه کد با دستور System.out.println سعی می کرد علامت های دیداری به خروجی اضافه کند. گاهی اوقات زمانیکه برنامه ها غلط بود، پشته ی trace معنادار یا خطی که در آن خطا اتفاق افتاده را نداشتید.
با اضافه کردن System.out.println در کد قبل ، یک روش زمخت برای trace برنامه بود ، اما netbeans راه های آسانتری به نام debugging tools ارائه کرد .
دیباگ کد های جاوا در IDE شامل مراحل خط به خط میان کد های برنامه است.شما می توانید اجرای برنامه را در خطوط خاصی ( breakpoint ها) متوقف کنید یا مقادیر متغییر ها و اشیا را ببینید.
بعضی از فعالیت هایی که دیباگ IDE انجام می دهد شامل زیر می باشد :
1- متوقف کردن برنامه در خط خاص
2- اجرای یک خط
3- پرش از روی یک خط از کدی که نمی خواهیم اجرا شود
4- اجرای برنامه تا زمانی که به جایی که مکان نما(cursor) قرار گرفته
5- دیدن پشته ی فراخوانی تا خط خاص
6- دیدن متغییر محلی
7- دیدن مقدار متغییر کلاس
8- ارزیابی مقدار بازگشتی یک متد بدون اینکه داخل آن برود
9- Trace کردن برنامه در طول نخ های چندگانه
10- توقف اجرای برنامه با شرط روی یک خط خاص
11- تغییر مقدار متغییر ها زمان اجرا برای دیدن اینکه چه تاثیری روی برنامه دارد.

Breakpoints

Breakpoint یک مفهوم مهم در دیباگ است و علامت ها و نشانه هایی را در جایی که می خواهیم اجرای برنامه متوقف شود قرار می دهد. برای دیباگ باید حد اقل یک breakpoint داشته باشید.
با چند روش می توان آن را در کد قرار داد.

ایجاد Breakpoint

1- برای ایجاد breakpoint روی روی نوار سمت چپ یعنی جایی که شماره خط وجود دارد کلیک می کنیم و یک خط صورتی رنگ طولانی ایجاد می شود.
وقتی برنامه دیباگ می شود اجرای برنامه روی هرکدام از خطوطی که breakpoint قرار دارد متوقف می شود.
2- راه دیگری برای اضافه کردن breakpoint وجود دارد. ابتدا خطی را که می خواهیم breakpoint قرار دهیم را
انتخاب می کنیم و سپس مسیر روبرو : > Toggle Line Breakpoint Debug
3- راه دیگری برای اضافه کردن breakpoint نوعی متفاوت وجود دارد که می توانیم class breakpoint اضافه کنیم
این روش اجازه می دهد که اجرای برنامه را زمانیکه کلاسی از ماشین مجازی جاوا load یا unload می شود متوقف کند.
از مسیر روبرو: Debug > New Breakpoint
در قسمت Breakpoint Type ، Class را انتخاب می کنیم
در فیلد Class Name نام کامل کلاس را وارد می کنیم
در قسمت Stop on :
Class Load : اجرای برنامه را وقتی که کلاس مورد نظر به JVM (ماشین مجازی جاوا ) load می شود ، متوقف می کند.
Class Unload : اجرای برنامه را وقتی که کلاس مورد نظر از JVM (ماشین مجازی جاوا ) unload می شود، متوقف می کند.
Class Load or Unload : اجرای برنامه را وقتی که کلاس مورد نظر به JVM ، load یا از JVM ، unload می شود ، متوقف می کند.
قسمت Condition به شما اجازه می دهد که یک یا چند کلاسی را استثنا بگیرید. و در پایین می توانید تعداد break را اختصاص دهید.
بخش Actions قسمتی است که تعیین می کند که هنگامی که به breakpoint می رسد چه اتفاقی بیافتد.

حذف Breakpoint

برای حذف breakpoint روی آن کلیک کرده و آن را ناپدید می کنیم.

غیر فعال کردن Breakpoint

در شکل زیر تیک نشان داده شده را بر می داریم:

و رنگ آن خاکستری می شود.

Debugging دیباگ یک پروژه

برای دیباگ باید حد اقل یک breakpoint داشته باشید.
وقتی که اولین بار اجرای برنامه متوقف می شود ، شما می توانید از طریق آپشن های زیر برنامه را trace کنید:

: یک خط از کد را اجرا می کند. اگر این خط فراخوانی یک تابع باشد، تابع را بدون اینکه به داخل تابع برود اجرا می کند
: یک خط از کد را اجرا می کند. اگر این خط فراخوانی یک تابع باشد، به داخل تابع می رود و در اولین خط آن متوقف می شود.
: یک خط از کد را اجرا می کند. اگر آن خط داخل یک تابع باشد، باقیمانده کد تابع را اجرا می کند مقدار بازگشتی فراخوانی تابع را برمی گرداند.
: خطی که مکان نما در آن قرار دارد را اجرا می کند.
: اجرای برنامه را تا رسیدن به Breakpoint بعدی یا اتمام برنامه ادامه می دهد.
ابتدا اگر پنجره output در پایین باز نباشد از مسیر روبرو آنرا باز می کنیم Window > Outpu t > Output
IDE کد را کامپایل می کند و چند پنجره دیباگ باز می کند، مانند : Debugging و Debugging Console مانند شکل زیر:
تب Debugging کنترل های ابتدایی هنگام دیباگ فراهم می کند. دو آیکن در کناره سمت چپ می بینید. بعد از دیباگ کردن ،
ایکن سبز می شود و قابل کلیک کردن است، این آیکن شما را به دیباگ قبلی بر می گرداند. تب Debugging Console شامل خروجی های استاندارد است
روش های مختلفی برای دیباگ در netbeans وجود دارد.

1- روش اول: از منوی Debug :

اگر Main Projectپروژه اصلی نداشته باشد،
1- دو حالت دارد، یکی اینکه پروژه چند کلاس و یک کلاس main مجزا داشته باشد و بخواهیم پروژه را از main دیباگ کنیم گزینه زیر را انتخاب می کنیم:
(Ctrl+F5 ) project Debug > Debug

2- اگر بخواهیم یک فایل کلاس را (بدون اینکه کل پروژه را دیباگ کنیم) دیباگ کنیم ، گزینه زیر را انتخاب می کنیم:

کللاسی که انتخاب می کنید باید main داشته باشد وگرنه پیغام زیر را می دهد:
اگر Main Projectپروژه اصلی داشته باشد:
اگر در چند پروژه داشته باشید و یکی از پروژه ها را به عنوان پروژه اصلی main project در نظر بگیرید ، یعنی هنگام ساخت یکی از پروژه ها، گزینه ی set as main project را تیک زده باشید
در پنجره project یکی از آنها پر رنگ تر می شود ( بدیهی است که فقط یک پروژه می تواند main project باشد)
فرض کنید که چند پروژه داریم و هنگام ایجاد آنها، هیچکدام آنها را main project قرار نداده ایم و اکنون می خواهیم یکی را main project در نظر بگیریم:
یا روی آن کلیک کرده و آن را main project در نظر می گیریم :
یا در فضای خالی پنجره project کلیک راست کرده و گزینه های نشان داده شده ی زیر را انتخاب می کنیم:
اگر خواستیم پروژه ای را از حالت main project خارج کنیم :
اکنون به ادامه بحث دیباگ با در نظر داشتن پروژه ای به عنوان main project می پردازیم:
اگر بخواهیم پروژه ای که main project است را دیباگ کنیم ، نیاز به انتخاب آن نیست و کافی است :
(Ctrl+F5 ) Main project Debug > Debug
اما اگر بخواهیم پروژه ای که main project نیست را دیباگ کنیم، فایل main آن پروژه را انتخاب می کنیم و در منوی Debug فقط debug file را میزنیم و اگر Debug main project را بزنیم فقط main project را دیباگ می کند.

این روش برنامه را اجرا می کند تا به اولین breakpoint برسد . می توانید از طریق آپشن های گفته شده در بالا برنامه را trace کنید. اگر breakpoint ای نداشته باشیم، برنامه run می شود تا به پایان برسد.

2- روش دوم : از مسیر روبرو: Debug > Run To Cursor

این روش برنامه را تا اولین خطی که موس رو ی آن قرار دارد ادامه می دهد
مثال : کلاس calculator را بسازید و کد های زیر را در آن وارد کنید و در خط 11 یک breakpoint قرار دهید:
وقتی که دیباگ را شروع می کنید، اجرا در خط 11 متوقف می شود و تب Debugging Console پیغام زیر را می دهد:
این تصویر نشان می دهد که دیباگ اجرا شده و در خط 11 که breakpoint وجود داشت، متوقف شده
برای متوقف کردن و پایان کار دیباگ از یکی دو مسیر زیر می رویم:

یکی از ویژگی مهم دیباگ کننده netbeans این است که می تواند، یک خط از کد را اجرا کند. در اینجا روش stepping نقش ایفا می کند.

3- روش سوم : از مسیر روبرو: Debug > Step Into

کلاسهای تابع main اولین جایی است که دیباگ کننده وارد آن می شود. این روش برنامه را از اولین خط تابع main اجرا می کند . شما می توانید به آسانی هر خط از کلاس را بدون داشتن breakpoint دیباگ کنید و بپیمایید.
وقتی به صورت عادی دیباگ می کنیم ، این گزینه را در toolbar هم داریم. ( )
روش دیگر این است که یک watch روی متغییر قرار دهید.

4- پنجره watch

این پنجره همه ی متغیییر ها و عباراتی که شما هنگام دیباگ کردن مشخص می کنید لیست می کند. به عنوان پیش فرض این پنجره به طور اتوماتیک از جایی که شروع به دیباگ می کنید باز می شود. یا می توانید از مسیر زیر آن را فعال کنید : Debugging > Watches window >
اگر هنگام دیباگ پنجره watchخودش باز شود با به پایان رسیدن دیباگ هم خودش بسته می شود اما اگر دستی این پنجره را باز کنیم تا زمانیکه خودمان آنرا نبندیم باز می ماند.
اطلاعاتی که هر بار عمل watch می گیرد شامل : نام متغییر و عبارت (expression ) ، نوع و مقدار است. اگر متغییر در سمت چپ خود یک کنترل داشت ، آنرا کلیک می کنیم تا آنرا توضیح دهد. اگر نوع شی را به صورت زیر خط دار و آبی نمایش داد، با کلیک کردن آن به آن شی در سورس کد می پرد. شما می توانید سلول value را کلیک کنید و مستقیما مقدار را تغییر دهید.
وقتی که مقدار جدیدی به watch اضافه کنید، ارزش متغییر سریع تغییر می کندو نشان داده می شود. مقدار یک watch به متن جاری بستگی دارد.هنگامیکه شما از میان کد برنامه حرکت می کنید پنجره watch به روز رسانی می شود.در بعضی موارد، دیباگ کننده علامت پوند(#) و یک شماره را به عنوان مقدار متغییر اختصاص می دهد. این شماره یک معرف یکتا نمونه معیین است . اگریک نمونه مشابه یا متفاوت نشان دهد شما می توانید این معرف را برای تعیین کردن استفاده کنید. شما نمی توانید این مقداررا تغییر دهید.
جدول زیر ایکون هایی که در سمت چپ نام اشیا نشان داده می شود را توصیف می کند:
اکنون برای مثال زیر (Example.java) یک watch ساده اصافه می کنیم:
کد های زیر را در ادیتور خود وارد کنید:
1- متغییر یا عبارت مورد نظر را در سورس برنامه انتخاب کرده ( در مثال زیر a ) و روی آن راست کلیک کرده و گزینه ی
New Watch را انتخاب می کنیم (ctrl+shift+f7) و یک dialog box جدید باز می شود که مقداری در text fild آن وجود دارد
2- Ok می کنیم.

پنجره ی whatch لیستی از watch های جاری و نوع و مقدارشان را نشان می دهد:

اگر پنجره watch فعال نباشد از مسیر زیر آنرا فعال می کنیم:
Variable window :
این پنجره نام ، نوع و مقدار همه ی مقادیر در محدوده جاری و همچنین متغییر های استاتیک از بقیه را نشان می دهد.
برای فعال کردن این پنجره از مسیر روبرو: windows > Debugging > Variables
دیباگ کننده به شما اجازه می دهد که مقادیر متغییر ها را در این پنجره تغییر دهید و اجرا برنامه را با استفاده از مقادیر جدید ادامه دهید.
اکنون با ذکر مثالی مطالب گفته شده را مرور می کنیم
کلاسی به نام (person.java) ایجاد می کنیم و کد های سیر را در آن وارد می کنیم.
یک watch ساده اصافه می کنیم و پنجره ی variables را بررسی می کنیم:
1- در کلاس person.java متغییر personal را انتخاب می کنیم.
2- دو روش برای افزودن watch وجود دارد یکی با نوار بالا و مسیر Debug> new watch یا با فشردن (ctrl+shift+f7) ، بعد ok می کنیم و personal به variable view اضافه می شود.
اولین breakpoint را دقیقا در خطی که در زیر نشان داده شده ایجاد می کنیم :
person2.setName(null);
حالا می خواهیم یک breakpoint دیگری در همان کلاس person.java در خط زیر اضافه کنیم
this.age = age;
در پایان کلاس Main.java را باز می کنیم و (Control+Shift+F5) را می زنیم و برنامه را دیباگ می کنیم
به محض اینکه دیباگ شروع شود اجرا در اولین breakpoint متوقف می شود.
Break point به IDE می گوید که موقتا برنامه را متوقف کندو به توسعه دهنده (برنامه نویس) اجازه دهد تا مقادیر متغییرها و watch را در آن نقطه آزمایش کند.
همانطور که در بالا نشان می دهد، watch را با الماس آبی وهمچنین متغییر های نرمال را با لوزی سبز نشان می دهد. این امکان در زمان اجرا وجود دارد که برای چک کردن محتویات اشیا watch و متغییر ها را توسعه دهیم.
نقطه اجرا با رنگ سبز هایلایت شده. برای پرش به خطی از کد F8 را می زنیم. برای ادامه F5 را می زنیم. IDE عملیات دیباگ را تا پیدا کردن breakpoint دیگر ادامه می دهد، در نقطه ای که اجرا متوقف می شود، توسعه دهنده (برنامه نویس) شانس دیگری برای آزمودن اجرا دارد.
در مثال ما اجرا تا تابع person2.setAge ادامه پیدا می کند. اگرbreakpoint دیگری نداشته باشیم اجرای برنامه تا اخر ادامه پیدا می کند.
breakpoint شرطی
می توانیم breakpoint شرطی ایجاد کنیم،
> properties > Breakpoint < کلیک راس روی breakpoint
پنجره ای باز می شود که در آن شروط را اختصاص می دهیم. که این مبحث را همین جا تمام می کنیم و وارد جزئیات بیشتر نمی شویم.